﻿using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using Controllers;
using Interfaces;
using Utilities;

namespace Views.Moduler
{
    public partial class SoftwareUdlån : Window
    {
        #region Fields

        private IProduktnøgle _selectedProduktnøgle;
        private Controller _controller;

        // vinduet er baseret på dette software
        private ISoftware _selectedSoftware;

        // valgte computer i det listview over computere der har lånt det pågældende software
        private IComputer _selectedComputerTilUdlån;

        // valgte computer i det listview over computere der IKKE har lånt det pågældende software
        private IComputer _selectedComputerUdlånt;

        #endregion

        #region Creation

        public SoftwareUdlån(ISoftware selectedSoftware, Controller controller)
        {
            InitializeComponent();

            _selectedSoftware = selectedSoftware;
            _controller = controller;

            OpdaterAlleListViews();

            OpdaterLabels();
        }

        #endregion

        #region Event handlers

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Escape)
            {
                Close();
            }
        }

        private void BtnTilføjProduktnøgle_Click(object sender, RoutedEventArgs e)
        {
            var form = new Form();
            form.Title = "Tilføj ny produktnøgle";
            form.BtnSubmit = "Tilføj";
            form.CreateDisabledTextBox("software", "Software:", _selectedSoftware.Navn);
            form.CreateTextBox("key", "Produktnøgle:");
            form.CreateIntegerBox("antal", "Antal installationer:", "1");
            form.CreateDateBox("dato", "Udløbsdato:", DateTime.Now.AddYears(5));

            var window = new FormWindow(form);
            if (window.ShowDialog() == true)
            {
                DateTime dato = (DateTime) form.Result["dato"];
                string nøgle = (string) form.Result["key"];
                string antal = (string) form.Result["antal"];

                if (dato.Date > DateTime.Today && 
                    nøgle.IsValidStringAndHasMaxLengthOf(40) &&
                    antal.IsIntegerGreaterThanZero())
                {
                    bool oprettet = _controller.OpretProduktnøgle(_selectedSoftware, nøgle, dato, int.Parse(antal));
                    if (oprettet)
                    {
                        OpdaterProduktnøgleListView();
                    }
                }
                else
                {
                    string errors = "";

                    if (!nøgle.IsValidString())
                    {
                        errors += "Du skal skrive en produktnøgle. ";
                    }
                    else
                    {
                        if (!nøgle.IsMaxLength(40)) errors += "Produktnøglen må maks være 40 tegn. ";
                    }

                    if(!antal.IsIntegerGreaterThanZero()) errors += "Antal gange nøglen må bruges, skal som minimum være 1. ";
                    if (dato.Date <= DateTime.Today) errors += "Udløbsdatoen, skal være senere end i dag. ";

                    MessageBox.Show(errors, "Validerings fejl", MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
        }

        private void BtnOpdaterProduktnøgle_Click(object sender, RoutedEventArgs e)
        {
            if (_selectedProduktnøgle == null) return;

            var form = new Form();
            form.Title = "Opdater produktnøgle";
            form.BtnSubmit = "Opdater";
            form.CreateDisabledTextBox("software", "Software:", _selectedSoftware.Navn);
            form.CreateDisabledTextBox("key", "Produktnøgle:", _selectedProduktnøgle.Nøgle);
            form.CreateIntegerBox("antal", "Antal gange til brug:", _selectedProduktnøgle.Antal.ToString());
            form.CreateDateBox("dato", "Udløbsdato:", _selectedProduktnøgle.Udløbsdato);

            var window = new FormWindow(form);
            if (window.ShowDialog() == true)
            {
                DateTime dato = (DateTime)form.Result["dato"];
                string antal = (string)form.Result["antal"];

                if (dato.Date > DateTime.Today &&
                    antal.IsIntegerGreaterThanZero())
                {
                    bool opdateret = _controller.OpdaterProduktnøgle(_selectedProduktnøgle, dato, int.Parse(antal));
                    if (opdateret)
                    {
                        OpdaterProduktnøgleListView();
                    }
                }
                else
                {
                    string errors = "";

                    if (!antal.IsIntegerGreaterThanZero()) errors += "Antal gange nøglen må bruges, skal som minimum være 1. ";
                    if (dato.Date <= DateTime.Today) errors += "Udløbsdatoen, skal være senere end i dag. ";

                    MessageBox.Show(errors, "Validerings fejl", MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
        }

        private void BtnFjernProduktnøgle_Click(object sender, RoutedEventArgs e)
        {
            if (_selectedProduktnøgle == null) return;

            var result =
                MessageBox.Show(
                    "Er du sikker på at du vile slette denne produktnøgle? Hvis den er tilknyttet computere, vil disse blive fjernet fra computerne.",
                    "Pas på", MessageBoxButton.YesNo, MessageBoxImage.Error);

            if (result == MessageBoxResult.Yes)
            {
                bool fjernet = _controller.FjernProduktnøgle(_selectedProduktnøgle);
                if (fjernet)
                {
                    OpdaterProduktnøgleListView();
                }
            }
        }   

        private void BtnFjernUdlån_Click(object sender, RoutedEventArgs e)
        {
            var computer = _selectedComputerUdlånt;
            if (computer == null) return;

            var result =
                MessageBox.Show(
                    "Er du sikker på du vil fjerne tilknytningen til denne computer? Produktnøglen der er tilknyttet computeren vil blive ledig.",
                    "Pas på",
                    MessageBoxButton.YesNo,
                    MessageBoxImage.Exclamation);

            
            if (result == MessageBoxResult.Yes)
            {
                // brugeren trykkede ok
                bool slettet = _controller.FjernSoftwareUdlån(computer, _selectedSoftware);
                if (slettet)
                {
                    OpdaterComputereListView();
                    OpdaterUdlånListView();
                }
            }
        }

        private void ListViewProduktnøgler_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var nøgle = ListViewProduktnøgler.SelectedItem as IProduktnøgle;
            _selectedProduktnøgle = nøgle;

            bool nøgleErValgt = _selectedProduktnøgle != null;

            BtnOpdaterProduktnøgle.IsEnabled = nøgleErValgt;
            BtnFjernProduktnøgle.IsEnabled = nøgleErValgt;
        }

        private void BtnUdlånSoftware_Click(object sender, RoutedEventArgs e)
        {
            var computer = _selectedComputerTilUdlån;
            if (computer == null) return;

            var form = new Form();
            form.Title = "Udlån software til computer";
            form.BtnSubmit = "Udlån";

            form.CreateDisabledTextBox("computer", "Computer:", computer.Navn);
            form.CreateDisabledTextBox("software", "Software:", _selectedSoftware.Navn);
            form.CreateComboBox("produktnøgle", "Produktnøgle:", _controller.HentLedigeProduktnøglerMedSoftware(_selectedSoftware), "Nøgle");
            form.CreateDateBox("udlånsdato", "Udlånsdato:", DateTime.Now);

            var window = new FormWindow(form);
            if (window.ShowDialog() == true)
            {
                var nøgle = form.Result["produktnøgle"] as IProduktnøgle;
                var dato = (DateTime) form.Result["udlånsdato"];

                if (nøgle != null)
                {
                    bool udlånt = _controller.OpretSoftwareUdlån(computer, nøgle, dato);
                    if (udlånt)
                    {
                        OpdaterComputereListView();
                        OpdaterUdlånListView();
                    }
                }
                else
                {
                    MessageBox.Show("Du skal vælge en produktnøgle!", "Der skete en fejl", MessageBoxButton.OK, MessageBoxImage.Error);
                    BtnUdlånSoftware_Click(null, new RoutedEventArgs());
                }
            }
        }

        // selection change på de computere der skal udlånes til
        private void ListViewComputere_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var computer = ListViewComputere.SelectedItem as IComputer;
            _selectedComputerTilUdlån = computer;

            bool valgt = computer != null;
            BtnUdlånSoftware.IsEnabled = valgt;
        }

        private void ListViewAlleUdlån_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var computer = ListViewAlleUdlån.SelectedItem as IComputer;
            _selectedComputerUdlånt = computer;

            bool valgt = computer != null;
            BtnFjernUdlån.IsEnabled = valgt;
        }

        private void MenuItemVisComputereMedProduktnøgle_Click(object sender, RoutedEventArgs e)
        {
            if (_selectedProduktnøgle == null) return;
            if (_selectedProduktnøgle.AntalUdlånt == 0) return;

            var window = new ProduktnøgleComputere(_controller, _selectedProduktnøgle);
            window.ShowDialog();
        }

        #endregion

        #region Tilstandsstyring

        public void OpdaterLabels()
        {
            LblAlleUdlånTitel.Content = String.Format("Computere med {0} installeret", _selectedSoftware.Navn);
            LblNytUdlånTitel.Content = String.Format("Udlån {0} til en ny computer", _selectedSoftware.Navn);
            LblProduktnøglerTitel.Content = String.Format("Produktnøgler til {0}", _selectedSoftware.Navn);
        }

        public void OpdaterAlleListViews()
        {
            OpdaterComputereListView();
            OpdaterProduktnøgleListView();
            OpdaterUdlånListView();
        }

        public void OpdaterProduktnøgleListView()
        {
            ListViewProduktnøgler.ItemsSource = null;
            ListViewProduktnøgler.ItemsSource = _controller.HentProduktnøglerMedSoftware(_selectedSoftware);
        }

        public void OpdaterUdlånListView()
        {
            ListViewAlleUdlån.ItemsSource = null;
            ListViewAlleUdlån.ItemsSource = _controller.HentComputereMedSoftware(_selectedSoftware);
        }

        public void OpdaterComputereListView()
        {
            ListViewComputere.ItemsSource = null;
            ListViewComputere.ItemsSource = _controller.HentComputereUdenSoftwareUdlån(_selectedSoftware);
        }

        #endregion
    }
}
